#include <iostream>
#include <stdio.h>
#include <string>

#include "tipos.h"
#include "ListaVendas.h"
#include "Estoque.h"

void confirmandoVendaAtual( int i, ListaVendas *v, Estoque *e  );
void menuPrincipal();
void menuVendas();

int main(int argc, char *argv[])
{
	std::string
	Descricao;
	
	bool
	sai, sai2;
	
	int
	codigoVendaAtual,codigoProduto,quantidade,w;
	
	float
	f;
	
	ListaVendas 
	v;
	
	Estoque 
	e;
	
	Venda*
	pV;
		
	Produto*
	p;
	
	int 
	opcao;
	
	sai = false;
	while( sai != true )
	{
		//system("clear");
		//printf("\033[2;30f");
		menuPrincipal();
		std::cin >> opcao;
		switch( opcao )
		{
			case 1:
				codigoVendaAtual = v.criaVenda();
				sai2 = false;
				while( sai2 != true )
				{

					menuVendas();
					std::cin >> opcao;
					switch(opcao)
					{
						case 1:
							std::cout << "Codigo do produto:";
							std::cin >> codigoProduto;
							std::cout << "Quantidade:";
							std::cin >> quantidade;
							if( !e.verificaSeHa( codigoProduto, quantidade ) )
							{
								std::cout << "Quantidade indisponivel!" << std::endl;
								break;
							}
							p = e.getProduto( codigoProduto );
							v.insereProdutoVenda( p, quantidade, codigoVendaAtual );
							break;
							
						case 2:
							//system("clear");
							pV = v.getVenda( codigoVendaAtual );
							pV->mostraProdutos();
							std::cout << "Pressione ENTER para Voltar!";
							std::cin >> w;
							break;
							
						case 3:
							confirmandoVendaAtual(codigoVendaAtual, &v, &e);
							sai2 = true;
							break;
							
					}
				}
					break;
				
			case 2:
				//system( "clear" );
				std::cout << "Inserir Produto:" << std::endl;
				std::cout << "Descricao:";
				std::cin >> Descricao;
				std::cout << "Valor de Compra:";
				std::cin >> f;
				e.inserirProduto( Descricao, f );
				break;
					
			case 3:
				//system( "clear" );
				std::cout << "Codigo do Produto:";
				std::cin >> codigoProduto;
				std::cout << "Quantidade:";
				std::cin >> quantidade;
				e.inserirQuantidadeProduto( codigoProduto, quantidade );
				break;
				
			case 4:
				//system( "clear" );
				e.mostraTodos();
				std::cin >> w;
				break;
				
			case 9:
				//system("clear");
				sai = true;
				break;
		}
	}
	return 0;
}

void confirmandoVendaAtual( int i, ListaVendas *v, Estoque *e )
{
	Venda*
	pAuxiliar;
	
	noLista*
	pProdutoxQuantidade;
	
	ListaEncadeada < noLista*, int > *
	ListaABaixarEstoque;	
	
	pAuxiliar = v->getVenda( i );
	
	ListaABaixarEstoque = pAuxiliar->confirmaVenda();
	
	while( !ListaABaixarEstoque->itsTheEnd() )
	{
		pProdutoxQuantidade = *ListaABaixarEstoque->retornaEsteEAvanca();
		e->retiraDoEstoque( pProdutoxQuantidade->pProduto->getCodigo(), pProdutoxQuantidade->quantidade );
	}
	
}

void
menuPrincipal()
{
	std::cout << "+----------------------------------------+" << std::endl
	          << "|       Programa da Venda legal!!!       |" << std::endl
	          << "|           O que deseja fazer:          |" << std::endl
	          << "|                                        |" << std::endl
	          << "| [ 1 ] - Comecar uma venda              |" << std::endl
	          << "| [ 2 ] - Cadastrar um produto           |" << std::endl
	          << "| [ 3 ] - Inserir quantidade a produto   |" << std::endl
	          << "| [ 4 ] - Listar Produtos                |" << std::endl
	          << "| [ 9 ] - Sair                           |" << std::endl
	          << "+----------------------------------------+" << std::endl
	          << "opcao:";

}

void
menuVendas()
{
	std::cout << "+========================================+"<< std::endl
                  << "I                 Venda:                 I"<< std::endl
	          << "I           O que deseja fazer:          I"<< std::endl
	          << "I                                        I"<< std::endl
	          << "I [ 1 ] - Inserir Produto                I"<< std::endl
	          << "I [ 2 ] - Vizualiza Venda                I"<< std::endl
	          << "I [ 3 ] - Confirma Venda                 I"<< std::endl
	          << "+========================================+"<< std::endl
	          << "opcao:";
}
